{
    "componentChunkName": "component---src-templates-article-js",
    "path": "/guides/tuto-upgrade-edixit-db-mysql57-mysql8 ",
    "result": {"data":{"asciidoc":{"html":"<h1>Tutorial Installation MySQL 5.7 sur CentOS</h1>\n<div id=\"preamble\">\n<div class=\"sectionbody\">\n<div class=\"paragraph\">\n<p>Ce tutorial permet d&#8217;installer une base de données MySQL 5.7 sur un environnement Centos 7.7\nL&#8217;installation se fait manuellement de bout en bout.</p>\n</div>\n<div class=\"paragraph\">\n<p>On suppose que le volume logique sur lequel doit être installé mysql (le disque externe) est sur un point de\nmontage appelé <code>/data/db</code> ou <code>/data</code>.</p>\n</div>\n<div class=\"paragraph\">\n<p>Notez que dans notre exemple, MySQL sera installé dans <code>/data/db/mysql</code>.</p>\n</div>\n<div class=\"admonitionblock tip\">\n<table>\n<tr>\n<td class=\"icon\">\n<div class=\"title\">Tip</div>\n</td>\n<td class=\"content\">\nLe point de montage doit être <code>/data/db</code> ou <code>/data</code> pour ne pas se retrouver avec un répertoire <code>lost+found</code> au milieu\ndes données de MySQL, typiquement <code>/data/db/mysql/lost+found</code>. La situation serait gênante\ncar MySQL croirait que c&#8217;est un schema&#8230;&#8203;\n</td>\n</tr>\n</table>\n</div>\n<div class=\"paragraph\">\n<p>On part d&#8217;une installation CentOS vierge. Testé sur une instance Amazon CentOS Linux 7 x86_64 (ami-0b850cf02cc00fdc8)</p>\n</div>\n</div>\n</div>\n<div class=\"sect1\">\n<h2 id=\"_préalable\">Préalable</h2>\n<div class=\"sectionbody\">\n<div class=\"sect2\">\n<h3 id=\"_selinux\">SELinux</h3>\n<div class=\"paragraph\">\n<p>Par simplicité, nous supposons que SELinux est <code>disabled</code>.\nVous pouvez vérifier si SELinux est activé avec la commande <code>sestatus</code> et modifier la propriété dans <code>/etc/selinux/config</code>\npour le passer à <code>disabled</code>.</p>\n</div>\n<div class=\"paragraph\">\n<p>Si vous souhaitez garder SELinux, pensez à ajouter les permissions nécéssaires au répertoire\n<code>/data/db/mysql</code> que nous allons créer (mêmes permissions que <code>/var/lib/mysql</code>)</p>\n</div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-bash\" data-lang=\"bash\">ls -Z /var/lib\ndrwxr-x--x. mysql   mysql   system_u:object_r:mysqld_db_t:s0 mysql</code></pre>\n</div>\n</div>\n</div>\n<div class=\"sect2\">\n<h3 id=\"_disques_externes\">Disques externes</h3>\n<div class=\"paragraph\">\n<p>Installation des disques externes sur un point de montage <code>/data</code> dans un contexte AWS.</p>\n</div>\n<div class=\"admonitionblock tip\">\n<table>\n<tr>\n<td class=\"icon\">\n<div class=\"title\">Tip</div>\n</td>\n<td class=\"content\">\nvous pouvez passer à la suite si vous gérez vos disques autrement. Notez que l&#8217;on ne fait pas de montage LVM\ndans le cadre de ce tutorial. Un montage LVM est préféré en production (pour permettre au disque d&#8217;être étendu)\n</td>\n</tr>\n</table>\n</div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-bash\" data-lang=\"bash\"># voir les disques\nlsblk\n# vérifier qu'il n'y a rien sur le disque (dans notre cas, le disque s'appelle /dev/xvdb)\nfile -s /dev/xvdb\n# si le resultat est /dev/xvdb: data, c'est que le disque est vide\n# formater le disque\nmkfs -t ext4 /dev/xvdb\n# monter le disque\nmkdir /data\nmount /dev/xvdb /data/\n# vérifier la taille\ncd /data\ndf -h .\n# faire un backup de la fstab\ncp /etc/fstab /etc/fstab.bak</code></pre>\n</div>\n</div>\n<div class=\"paragraph\">\n<p>Ouvrir le fichier fstab et ajouter le disque avec par exemple, la ligne suivante</p>\n</div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre>/dev/xvdb   /data   ext4    defaults,nofail 0   0</pre>\n</div>\n</div>\n<div class=\"paragraph\">\n<p>et monter le tout</p>\n</div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-bash\" data-lang=\"bash\">mount -a</code></pre>\n</div>\n</div>\n</div>\n</div>\n</div>\n<div class=\"sect1\">\n<h2 id=\"_installation\">Installation</h2>\n<div class=\"sectionbody\">\n<div class=\"paragraph\">\n<p>Enlever les packages <code>postfix</code> pour eviter les conflits potentiels</p>\n</div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-bash\" data-lang=\"bash\">sudo yum remove postfix</code></pre>\n</div>\n</div>\n<div class=\"paragraph\">\n<p>Répondre oui aux questions posées</p>\n</div>\n<div class=\"paragraph\">\n<p>Enlever les packages <code>mariadb_libs</code> pour eviter les conflits potentiels :</p>\n</div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-bash\" data-lang=\"bash\">sudo yum remove mariadb-libs</code></pre>\n</div>\n</div>\n<div class=\"paragraph\">\n<p>Répondre oui aux questions posées</p>\n</div>\n<div class=\"paragraph\">\n<p>Vérifier la version du serveur</p>\n</div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-bash\" data-lang=\"bash\">cat /etc/centos-release</code></pre>\n</div>\n</div>\n<div class=\"paragraph\">\n<p>Ce qui vous donnera par exemple : <code>CentOS Linux release 7.6.1810 (Core)</code>.</p>\n</div>\n<div class=\"paragraph\">\n<p>Allez voir sur le site <a href=\"https://dev.mysql.com/downloads/repo/yum/\" class=\"bare\">https://dev.mysql.com/downloads/repo/yum/</a> quel est le repository qui correspond à votre version de CentOS</p>\n</div>\n<div class=\"paragraph\">\n<p>Installer <code>yum-utils</code> pour avoir <code>yum-config-manager</code></p>\n</div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-bash\" data-lang=\"bash\">yum install yum-utils</code></pre>\n</div>\n</div>\n<div class=\"paragraph\">\n<p>Outils complémentaires</p>\n</div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-bash\" data-lang=\"bash\">yum install wget\nyum install vim</code></pre>\n</div>\n</div>\n<div class=\"paragraph\">\n<p>Telecharger le repository yum en fonction de ce que vous avez trouvé dans le repository.</p>\n</div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre>wget https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm\nyum install mysql80-community-release-el7-3.noarch.rpm</pre>\n</div>\n</div>\n<div class=\"paragraph\">\n<p>Valider la clé hash</p>\n</div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre>md5sum mysql80-community-release-el7-3.noarch.rpm</pre>\n</div>\n</div>\n<div class=\"paragraph\">\n<p>Le resultat de cette commande doit etre le meme que le hash defini pour ce repository sur le site\n<a href=\"https://dev.mysql.com/downloads/repo/yum/\" class=\"bare\">https://dev.mysql.com/downloads/repo/yum/</a></p>\n</div>\n<div class=\"paragraph\">\n<p>L&#8217;installation par defaut pour ce repo est mysql8.0 on peut redefinir la version installée en desactivant mysql8 via\nl&#8217;outil yum-config-manager et en activant l&#8217;install de mysql5.7 avec la commande.</p>\n</div>\n<div class=\"admonitionblock tip\">\n<table>\n<tr>\n<td class=\"icon\">\n<div class=\"title\">Tip</div>\n</td>\n<td class=\"content\">\nEdixit fonctionne sous MYSQL 8 aussi. Des réglages additionnels peuvent être nécéssaires mais sont hors scope de\nce document\n</td>\n</tr>\n</table>\n</div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre>yum-config-manager --disable mysql80-community\nyum-config-manager --enable mysql57-community</pre>\n</div>\n</div>\n<div class=\"paragraph\">\n<p>Verifiez que la version activée est bien la version desirée (on peut se tromper facilement et il n&#8217;y a pas de warning)</p>\n</div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre>yum repolist enabled | grep mysql</pre>\n</div>\n</div>\n<div class=\"paragraph\">\n<p>Le resultat de cette commande doit ressembler à ça :</p>\n</div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre>mysql-connectors-community/x86_64 MySQL Connectors Community                 118\nmysql-tools-community/x86_64      MySQL Tools Community                       95\nmysql57-community/x86_64          MySQL 5.7 Community Server                 364</pre>\n</div>\n</div>\n<div class=\"paragraph\">\n<p>Installer mysql</p>\n</div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre>yum install mysql-server</pre>\n</div>\n</div>\n<div class=\"paragraph\">\n<p>Dire oui a toutes les questions</p>\n</div>\n</div>\n</div>\n<div class=\"sect1\">\n<h2 id=\"_configuration\">Configuration</h2>\n<div class=\"sectionbody\">\n<div class=\"paragraph\">\n<p>Calculer la taille de l&#8217;espace innodb nécéssaire : <a href=\"https://scalegrid.io/blog/calculating-innodb-buffer-pool-size-for-your-mysql-server/\" class=\"bare\">https://scalegrid.io/blog/calculating-innodb-buffer-pool-size-for-your-mysql-server/</a></p>\n</div>\n<div class=\"paragraph\">\n<p>Quelques exemples :</p>\n</div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre>prod\t8Gb RAM\t6G\nrecette\t4Gb RAM\t2G\nsandbox\t2Gb RAM\t1280</pre>\n</div>\n</div>\n<div class=\"admonitionblock tip\">\n<table>\n<tr>\n<td class=\"icon\">\n<div class=\"title\">Tip</div>\n</td>\n<td class=\"content\">\nune bonne pratique consiste à ce que la Timezone de MySQL soit TOUJOURS UTC quelle que soit la Timezone\ndu host sur lequel MySQL est installé.\n</td>\n</tr>\n</table>\n</div>\n<div class=\"paragraph\">\n<p>Par défaut, MySQL utilise la Timezone du host sur lequel il fonctionne. Si la Timezone retournée est\nUTC, vous n&#8217;avez rien à faire. Si la timezone retournée est Europe/Paris par exemple, il faudra forcer la\ntimezone à UTC dans le fichier de configuration <code>my.cnf</code> de MySQL.</p>\n</div>\n<div class=\"paragraph\">\n<p>Vérifier la timezone de la VM.</p>\n</div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre>timedatectl</pre>\n</div>\n</div>\n<div class=\"paragraph\">\n<p>Ouvrir le fichier <code>/etc/my.cnf</code> et y ajouter les lignes de configuration suivantes dans la section <em>server</em>.</p>\n</div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre># mettre la bonne taille en fonction de ce que vous avez calculé\ninnodb_buffer_pool_size=1280M\nexpire_logs_days=7\n# si vous devez forcer la Timezone à UTC\ndefault-time-zone=+00:00\nslow_query_log=1\n# permet à MYSQL de ne pas planter lorsqu'un utilisateur met des emojis dans les champs textes...\ncharacter-set-server=utf8mb4\ncollation-server=utf8mb4_unicode_520_ci</pre>\n</div>\n</div>\n<div class=\"paragraph\">\n<p>Dans le même fichier changer datadir et socket aussi en fonction de vos répertoires d&#8217;installation</p>\n</div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre>datadir=/data/db/mysql\nsocket=/data/db/mysql/mysql.sock</pre>\n</div>\n</div>\n<div class=\"paragraph\">\n<p>À la fin du fichier ajouter une section client pour configurer la ligne de commande MySQL cette fois.</p>\n</div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight\"><code>[client]\nport=3306\nsocket=/data/db/mysql/mysql.sock</code></pre>\n</div>\n</div>\n<div class=\"paragraph\">\n<p>Déplacer le répertoire d&#8217;install de mysql dans <code>/data/db/mysql</code></p>\n</div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-bash\" data-lang=\"bash\">mkdir -p /data/db/mysql\nchown mysql: /data/db/mysql</code></pre>\n</div>\n</div>\n<div class=\"paragraph\">\n<p>Normalement si MySQL n&#8217;a pas été démarré avant, cette opération est inutile car /var/lib/mysql/ doit être vide. Mais au cas où :</p>\n</div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-bash\" data-lang=\"bash\">mv /var/lib/mysql/* /data/db/mysql/</code></pre>\n</div>\n</div>\n</div>\n</div>\n<div class=\"sect1\">\n<h2 id=\"_1er_démarrage\">1er Démarrage</h2>\n<div class=\"sectionbody\">\n<div class=\"paragraph\">\n<p>Démarrer le service</p>\n</div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre>systemctl start mysqld</pre>\n</div>\n</div>\n<div class=\"paragraph\">\n<p>Recuperer le mot de passe generé</p>\n</div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-bash\" data-lang=\"bash\">sudo grep 'temporary password' /var/log/mysqld.log</code></pre>\n</div>\n</div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-text\" data-lang=\"text\">2019-09-30T16:15:58.834744Z 1 [Note] A temporary password is generated for root@localhost: qwwEdoqyw6&amp;j</code></pre>\n</div>\n</div>\n<div class=\"paragraph\">\n<p>Se connecter à mysql avec ce mot de passe</p>\n</div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-bash\" data-lang=\"bash\">mysql -u root -p</code></pre>\n</div>\n</div>\n<div class=\"paragraph\">\n<p>Changer le mot de passe</p>\n</div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-sql\" data-lang=\"sql\">ALTER USER 'root'@'localhost' IDENTIFIED BY 'votre_nouveau_mot_de_passe';</code></pre>\n</div>\n</div>\n<div class=\"paragraph\">\n<p>Stocker le mot de passe dans votre vault ou votre Keepass.</p>\n</div>\n<div class=\"paragraph\">\n<p>Quitter mysql et se reconnecter avec le nouveau mot de passe pour vérifier que la connexion est valide et le\nmot de passe fonctionne.</p>\n</div>\n<div class=\"paragraph\">\n<p>En profiter pour verifier la timezone avec la commande</p>\n</div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-sql\" data-lang=\"sql\">SELECT @@GLOBAL.time_zone, @@SESSION.time_zone;</code></pre>\n</div>\n</div>\n<div class=\"paragraph\">\n<p>et ensuite</p>\n</div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-sql\" data-lang=\"sql\">select now();</code></pre>\n</div>\n</div>\n<div class=\"paragraph\">\n<p>Et constater que la date renvoyée est bien en UTC (une heure ou deux de décalage selon la période de l&#8217;année avec votre montre si vous êtes en France)</p>\n</div>\n</div>\n</div>\n<div class=\"sect1\">\n<h2 id=\"_base_de_données_edixit\">Base de données Edixit</h2>\n<div class=\"sectionbody\">\n<div class=\"paragraph\">\n<p>Créer la base de donnée <code>edixit</code> et y ajouter un utilisateur.</p>\n</div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-sql\" data-lang=\"sql\">CREATE DATABASE edixit;\nCREATE USER 'edixit'@'%' IDENTIFIED BY 'votre_mot_de_passe_special_edixit';\nGRANT ALL PRIVILEGES ON edixit.* TO 'edixit'@'%' WITH GRANT OPTION;</code></pre>\n</div>\n</div>\n<div class=\"paragraph\">\n<p>Tenter de s&#8217;y connecter avec cet utilisateur depuis une autre machine qui a accès à cet host (typiquement depuis le\nhost de votre serveur d&#8217;application <code>edixit_app</code>).</p>\n</div>\n</div>\n</div>\n<div class=\"sect1\">\n<h2 id=\"_backups\">Backups</h2>\n<div class=\"sectionbody\">\n<div class=\"admonitionblock tip\">\n<table>\n<tr>\n<td class=\"icon\">\n<div class=\"title\">Tip</div>\n</td>\n<td class=\"content\">\nIl est très largement conseillé de ne <strong>pas</strong> utiliser mysqldump pour faire des backups mais utiliser une solution\nprofessionnelle qui sait faire des backups à chaud. Voir <a href=\"https://dev.mysql.com/doc/refman/8.0/en/backup-methods.html\" class=\"bare\">https://dev.mysql.com/doc/refman/8.0/en/backup-methods.html</a> .\nUne solution type Percona ou MySQL Entreprise est fortement recommandée.\n</td>\n</tr>\n</table>\n</div>\n<div class=\"paragraph\">\n<p>Créer un user pour les backups avec tous les droits sur toutes les tables (voir les procédures ci-dessus)</p>\n</div>\n<div class=\"paragraph\">\n<p>Créer un fichier <code>/root/.my.cnf</code> avec une section spéciale pour mysqldump</p>\n</div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre>[mysqldump]\nuser=&lt;userDeBackup&gt;\npassword=&lt;passwordUserDeBackup&gt;</pre>\n</div>\n</div>\n<div class=\"paragraph\">\n<p>Créer le répertoire des backups <code>/data/db/backups</code> et le script <code>mysql-db-backups.sh</code> (n&#8217;oubliez pas le <code>chmod u+x</code>\npour le rendre executable).</p>\n</div>\n<div class=\"paragraph\">\n<p>Notez que nous n&#8217;utilisons pas l&#8217;option <code>--databases</code> pour ne pas forcer le nom\ndu schema dans le <em>dump</em> (et pouvoir faire une restore sous un autre nom).</p>\n</div>\n<div class=\"paragraph\">\n<p>Il n&#8217;y a pas de triggers dans edixit, mais il y a des routines, veillez donc à ce que l&#8217;option <code>--routines</code> soit présente.</p>\n</div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight\"><code class=\"language-bash\" data-lang=\"bash\">#!/bin/sh\nstamp=$(date \"+%y-%m-%d-%H-%M\")\n/usr/bin/mysqldump --single-transaction --hex-blob --routines edixit | gzip -9 &gt; /data/db/backups/edixit-backup-${stamp}.sql.gz</code></pre>\n</div>\n</div>\n<div class=\"paragraph\">\n<p>Tester le script une fois et voir le backup réalisé</p>\n</div>\n<div class=\"paragraph\">\n<p>Mettre en crontab : créer un fichier <code>/etc/cron.daily/mysqldump</code></p>\n</div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre>0 1 * * * /data/db/backups/mysql-db-backup.sh</pre>\n</div>\n</div>\n</div>\n</div>","document":{"title":"Tutorial Installation MySQL 5.7 sur CentOS"}}},"pageContext":{"id":"87ec0a18-1116-5b56-ac83-72f4e9fc45bc"}},
    "staticQueryHashes": ["1586626695"]}